/**
 * \file SnakerUtils.h
 */
#pragma once

#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <list>
#include <map>
#include <string>
#include <vector>
#ifdef _WIN32
#include "ncurses/curses.h"
#elif __linux__
#include <ncurses.h>
#endif


/**
 * @brief 计时器
 */
class TimeCounter {
   private:
    clock_t _time_start; /**< 记录开始计时的时间，每次开始计时时重置为调用时时间. */

   public:
    TimeCounter(); /**< 构造函数 */
    clock_t Start(); /**< 开始计时，每次调用重置_time_start. */
    clock_t Read(); /**< 读取从计时开始到当前时间的间隔。 */
};

/**
 * @brief 全局随机数生成器
 */
class Randomizer {
public:
    int seed; /**< 全局通用的随机数种子 */
    Randomizer();
    Randomizer(int seed);
    int glob_rand(); /**< 调用系统的rand()生成伪随机数 */
};

const int STEP[4][2] = {
    {0, 1}, 
    {0, -1}, 
    {1, 0}, 
    {-1, 0}
};
#define STEP_UP         3
#define STEP_DOWN       2
#define STEP_RIGHT      0
#define STEP_LEFT       1

inline int GetDirect(int xdes, int ydes, int xsrc, int ysrc) {
    return xdes == xsrc ? (ydes == ysrc ? 0 : (ydes < ysrc ? STEP_LEFT : STEP_RIGHT)) : (xdes < xsrc ? STEP_UP : STEP_DOWN);
}

int dim(int, int);
int mdim(int, int);